﻿namespace Digitalmes.Infrastructure.IO;

/// <summary>
/// Excel 导出接口。
/// </summary>
public interface IExcelExport
{
    /// <summary>
    /// 导出数据。
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="path">导出的文件路径。</param>
    /// <param name="data">要导出的数据集合。支持集合合 匿名类型 和 强类型，也支持 <see cref="Enumerable{IDictionary{string, object}}"/> 。</param>
    /// <param name="sheetName">默认保存的 sheet 名称</param>
    /// <param name="isCSV">是否为 CSV 文件，否则保存为 XLSX 文件，默认为 false</param>
    void SaveAs<T>(string path, IEnumerable<T> data, string sheetName = "Sheet1", bool isCSV = false);

    /// <summary>
    /// 导出数据。
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="stream">导出的文件流。</param>
    /// <param name="data">要导出的数据集合。支持集合合 匿名类型 和 强类型，也支持 <see cref="Enumerable{IDictionary{string, object}}"/> 。</param>
    /// <param name="sheetName">默认保存的 sheet 名称</param>
    /// <param name="isCSV">是否为 CSV 文件，否则保存为 XLSX 文件，默认为 false</param>
    void SaveAs<T>(Stream stream, IEnumerable<T> data, string sheetName = "Sheet1", bool isCSV = false);

    /// <summary>
    /// 导出数据。
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="path">导出的文件路径。</param>
    /// <param name="data">要导出的数据集合。支持集合合 匿名类型 和 强类型，也支持 <see cref="Enumerable{IDictionary{string, object}}"/> 。</param>
    /// <param name="sheetName">默认保存的 sheet 名称</param>
    /// <param name="isCSV">是否为 CSV 文件，否则保存为 XLSX 文件，默认为 false</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task SaveAsAsync<T>(string path, IEnumerable<T> data, string sheetName = "Sheet1", bool isCSV = false, CancellationToken cancellationToken = default);

    /// <summary>
    /// 导出数据。
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="stream">导出的文件流。</param>
    /// <param name="data">要导出的数据集合。支持集合合 匿名类型 和 强类型，也支持 <see cref="Enumerable{IDictionary{string, object}}"/> 。</param>
    /// <param name="sheetName">默认保存的 sheet 名称</param>
    /// <param name="isCSV">是否为 CSV 文件，否则保存为 XLSX 文件，默认为 false</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task SaveAsAsync<T>(Stream stream, IEnumerable<T> data, string sheetName = "Sheet1", bool isCSV = false, CancellationToken cancellationToken = default);
}
